package com.shujia

import scala.io.{BufferedSource, Source}

object Demo05WordCountScala {
  def main(args: Array[String]): Unit = {
    // 1、读取文件
    val source: BufferedSource = Source
      .fromFile("scala/data/words.txt")

    // 获取数据
    val lines: Array[String] = source.getLines().toArray
    // println：Any => Unit
    // foreach需要接收一个函数f：String => Unit
    // String类型跟Array中每一个元素的类型有关
    // foreach 方法会将Array中的每一个元素（每一条数据）传给函数f
    //    lines.foreach(println)

    def splitAndToList(line:String):List[String] = {
      line.split(",").toList
    }

    // 对每一行数据进行切分 并且进行扁平化处理（将得到的每一个单词进行展开）
    val wordsArr: Array[String] = lines.flatMap(splitAndToList)

    def specifyGroupByColumn(word:String):String ={
      word
    }



    // 按照单词进行分组
    val groupByMap: Map[String, Array[String]] = wordsArr.groupBy(specifyGroupByColumn)

    def wordCnt(kv:(String,Array[String])):Unit = {
      val word: String = kv._1
      val cnt: Int = kv._2.length
      println((word,cnt))
    }



    // 通过获取Map中的Value其长度或者size即可统计单词的数量
    groupByMap.foreach(wordCnt)

    lines
      .flatMap(splitAndToList)
      .groupBy(specifyGroupByColumn)
      .foreach(wordCnt)

    lines
      .flatMap(_.split(",").toList)
      .groupBy(word => word)
      .foreach(kv => {
        val word: String = kv._1
        val cnt: Int = kv._2.length
        println((word, cnt))
      })


    // 关闭文件
    source.close()

  }

}
